home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus Special 26
/
AMIGAplus Sonderheft 26 (2000)(Falke)(DE)(Track 1 of 2)[!].iso
/
Tools
/
GFX-Viewer
/
Animviewer
/
mpegvideo_datatype
/
classbase.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-03-29
|
31KB
|
793 lines
/*
**
** $VER: classbase.c 1.11 (7.11.97)
** mpegvideo.datatype 1.11
**
** Library routines for a DataTypes class
**
** Written 1996/1997 by Roland 'Gizzy' Mainz
** Original example source from David N. Junod
**
*/
/* main includes */
#include "classbase.h"
#ifdef __SASC
/* SAS/C compatibly hack. This may be caused by a math library */
__stdargs
void _XCEXIT( long dummy )
{
}
#endif /* __SASC */
/****** mpegvideo.datatype/--datasheed-- *************************************
*
* NAME
* mpegvideo.datatype -- data type for mpeg video streams
*
* SUPERCLASS
* animation.datatype
*
* DESCRIPTION
* The mpegvideo data type, a sub-class of the animation.datatype, is
* used to load and play mpeg 1 video streams (Layer I).
*
* METHODS
* OM_NEW -- Create a new animation object from a description file. The
* source may only be a file.
*
* OM_DISPOSE -- Dispose instance and contents (frames, colormaps etc.),
* then pass msg to superclass
*
* OM_UPDATE -- Perform an ICM_CHECKLOOP check, and if succesfull, the
* method will be executed like OM_SET downstairs.
*
* OM_SET -- Pass msg to superclass, and if the mpegvideo.datatype
* instance is the "top instance", call GM_RENDER if retval from
* superclass was != 0UL.
*
* ADTM_LOADFRAME -- Fill in struct adtFrame with requested information
* from internal FrameNode list like bitmap, colormap, samples, etc..
*
* All other methods are passed unchanged to superclass.
*
* ATTRIBUTES
* Following attributes are set by the object and are READ-ONLY for
* applications:
* DTA_NominalHoriz -- same as ADTA_Width
* DTA_NominalVert -- same as ADTA_Height
* DTA_ObjName -- same as DTA_Name
* ADTA_Width -- set by video stream
* ADTA_Height -- set by video stream
* ADTA_Depth -- set by video stream (or by prefs)
* ADTA_NumColors -- set by ADTA_Depth or to the num. of
* palette entries
* ADTA_ColorRegisters -- obj's palette with ADTA_NumColors entries
* ADTA_CRegs -- obj's palette with ADTA_NumColors entries
* ADTA_Frames -- total number of frames
* ADTA_FramesPerSecond -- set by video stream
* ADTA_ModeID -- calculated internally or set by prefs
* ADTA_KeyFrame -- key frame
* ADTA_Sample -- sample (optional, if a sample is attached)
* ADTA_SampleLength -- sample length (optional, see ADTA_Sample)
* ADTA_Period -- sample period (optional, see ADTA_Sample)
* ADTA_Volume -- sample volume (optional, see ADTA_Sample)
* ADTA_Cycles -- sample cycle (optional, see ADTA_Sample)
*
* BUGS
* - If the mpeg video stream is not 100% standart conform,
* the decoder part of this datatype will CRASH your machine.
* Innocent memory will be overwritten !!
*
* - If you don't have my "paranimdtcpatch" patch running,
* animation.datatype (animation.datatype 40.7 (28.09.93)) subclasses
* will suffer under timing problems when two or more
* animation.datatype objetcs are playing. I've released a matching
* patch, DON'T blame me for this bug. Any comments for this problem
* should be related to the "paranimdtcpatch" project.
* "paranimdtcpatch" is available in the aminet
* ("util/dtype/panimdtcptch012.LhA").
* NOTE that animation.datatype V41 does NOT require the patch
* anymore.
*
* - In large videos, the frames at the end will be played slower than
* those at the beginning of the file. This is the result of the
* sequential search internally used (only serious with more than 25000
* frames (mc68030/50mhz)).
* Will be fixed.
*
* - The LOADALL mode does not work perfectly. It sometimes "forgets" to
* fill some frames during loading.
*
* - The time code in the NOLODALL mode is slightly wrong (I assume up
* to +/- 6 frames).
*
* - The NOPFRAMES and NOBFRAMES options are incompatible with the
* NOLOADALL mode.
*
* - CyberGFX 24 bit output mode uses 32 bit ARGB bitmaps, but the A
* (alpha) byte is not set to 0xFF (visible), instead it is set to 0.
* The same for 15 bit output mode, where the MSB is a alpha mask bit.
*
* TODO
* - better error handling (and error messages)
*
* - code cleanup
*
* - bug fixing
*
* - Writing an amigaguide document
*
* - EHB
*
* HISTORY
* V1.1
* First (official) public release.
*
* V1.2
* Major code cleanup. I decided to rebuild the whole project from
* scratch instead of releasing my internal V1.8. The reason is that
* many things coded in it wasn't done with the required care. Now
* I try to fix this.
*
* - Sorry, but in the V1.1 release, I've forgotten the COPYRIGHT
* notice. Because I don't have the original ones (my code was a
* mergin of mpeg_play 1.X, 2.0, I've taken them from the
* mpeg_play 2.0 distribution).
*
* - Implemented the NOPFRAMES and NOBFRAMES switch (for those people
* who like it).
*
* - The loader now returns usefull return codes instead of failing
* silently.
*
* - Decrased the default depth from 7 to 5 planes. This is a more
* reliable default value for grayscale mpeg videos (screen or
* window).
*
* - Implemented "DICECOLOR" and "ORDERED" dithering.
* The options COLORERROR and DICESKIP are for fine-tuning
* speed <--> color output.
*
* - Introduced MAXFRAME (maximum number of frame to load) and
* SKIPFRAMES to allow loading of large videos.
*
* - MODEID option added (for those which don't like the default
* settings).
*
* - The datatypes descriptor file was WRONG. Now it should be correct.
* If not, send me a mail (and if possible, the sample file which
* won't work (packed with LhA for compression and CHECKSUMMING).
* (Later versions of the descriptor should use additional code
* to check the data).
*
* V1.3
* - COLOR output implemented.
*
* - DICECOLOR: Found a bug (?? very strange one ??) in my code which
* avoids the usage of a frame palette. DICECOLOR was intended
* to produce high-quality per frame color remapping instead using
* a global anim palette. Broken (e.g. working, but after a frame is
* finished, the color table isn't cleared for now...).
*
* - I found out that the most time is consumed by the WritePixelArray
* and copy functions. Later versions should contain a custom
* WritePixelArray replacement which should be able to write directly
* into FAST-RAM instead of writing into CHIP-RAM and them do a copy
* into FAST-RAM. This would save __MUCH__ time.
*
* - Silly mistake: A
* SetIoErr( 0L ); len = FRead( ..., requested ); sequence returns
* under various fs IoErr() == (-1L) or something else. The loader
* then aborts with this error code. (The code worked with RAM: disk,
* my VideoCD-fs ("white book" mode)) and AMICDROM, but wasn't tested
* with FFS or something else).
* The code now uses Read instead of FRead, checks for
* (len != requested), and only if TRUE IoErr() will be checked for
* any error.
*
* - Introduced BUFFER preferences option.
*
* - A CTRL-D signal send to the loading process now stops the load.
* This feature was implemented in V1.2, but I forgot to write it
* down here.
*
* - The autodoc now has a TOC (table of contents).
*
* - Support for Martin Apel's VMM (Virtual Memory Manager).
* (USEVMM switch in prefs file). The bitmaps can now be in virtual
* memory (the colormaps are traditional allocated by GetColorMap
* and cannot be in virtual memory (not yet nor in the future !)).
* The mpegvideo.datatype uses the vmm.library, this allows
* virtual memory usage even if the vmm.prefs disables virtual memory
* for all other tasks.
* NOTE: VMM is Shareware !!
*
* V1.4
* - vmm.library is now opened on demand (e.g. the USEVMM switch was
* set in the prefs file) inside the OM_NEW method.
* This fixes two problems:
* First: vmm.library was opened even it wasn't used.
* Second: OpenLibrary( "vmm.library", ... ) inside the LibInit
* function caused various problems.
* vmm.library will be closed by LibExpuge function.
*
* - Removed serial verbose output. Now, if the VERBOSE switch was set
* in the prefs file, all verbose output will be printed to
* "CON://///auto/wait/close/inactive".
*
* - Set the SC NOOPTIMIZERPEEPHOLE switch for mc68060 support:
* phase5 said that SAS/C 6.56 has a small bug in the peephole
* optimizer which may cause trouble with mc68060. The peephole
* optimizer will be turned on again if I know more details (and
* a workaround).
*
* - The product of LUM_RANGE * CR_RANGE * CB_RANGE was limited to
* a maximum of 512. LUM_RANGE, CR_RANGE, CB_RANGE can now have
* any positive value up to 255. A value of 0 is treated as 1,
* fixing the problem of a possible division by zero.
*
* - Found a bug in COLOR dithering, which causes quality loss and
* color disorientation. Fixing this bug will take MUCH time.
* Not fixed yet.
*
* - To match the "DataTypes proposal", changes have been made:
* 1. The location of the prefs file is now ENV:Classes/DataTypes/
* mpegvideo.prefs instead of ENV:DataTypes/mpegvideo.prefs
* 2. Subclasses of mpegvideo.datatype are not supported. Any
* attempt to create a subclass object of mpegvideo.datatype
* will be rejected by mpegvideo.datatype.
*
* - Partial code cleanup. I've implemented partial support for
* output depths up to 16 bits. Currently, I'm limited to a maximum
* depth of 8 bitplanes (e.g. 256 colors) for two reasons:
* First, the system WritePixelArray8 function handles only byte
* width pen indexes, second, animation.datatype handles only a
* bitmaps up to 8 planes. Future releases of animation.datatype may
* handle deeper bitplanes. (Custom players like my DBufDTAnim which
* are using their own display code are able to display deeper
* bitmaps yet.)
*
* - Found out a little problem: When using VMM (swap file) with
* Enforcer, enforcer hits may block your system (occured on a
* A2000 Apollo 2030 mc68030 board).
* Who knows an answer for this problem ?
*
* V1.5
* Minor changes to support special compiled versions for 68020+,
* fpu etc.
*
* - Implemented the IGNOREERRORS switch, which attempts to ignore any
* error during loading.
*
* - Removed some dead code.
*
* V1.6
* The datatypes supports now scaling and sound. Sound was implemented
* for two reasons:
* 1. For those streams which are distributed with a matching sound
* file.
* 2. I'm reworking mpegsystem.datatype (which can play system streams,
* e.g. video with interleaved audio). The goal is to implement
* mpegsystem.datatype as a subclass of mpegvideo.datatype. The
* audio stream will be parsed using mpegaudio.datatype.
* Note that mpegvideo.datatype is still a GID_ANIMATION type datatype.
* The GID_#? idetifiers belongs to the source data, not the
* modifications done by a datatype code (a mpeg 1 video stream does
* not contain any audio information, the sound is attached later).
*
* - Implemented the WIDTH and HEIGHT options in the prefs file to
* support scaling.
*
* - Implemented SAMPLE and VOLUME options to support sound.
*
* - Now uses BestModeID for selecting the screen mode of the
* animation. The MODEID preference option overides this.
* The old behavior was to set the ADTA_ModeID attribute only if the
* MODEID prefs option was set, otherwise the default from
* animation.datatype was taken (which was everytimes 0).
*
* - Fixed the FPS preference option. If it was set, the value was got
* from the depth option instead using the given value.
*
* - Implemented a processing gauge as requested by Allan Odgaard
* (Duff@DK-Online.DK) and many other people. The matching
* NOPROGRESSGAUGE switch disables it. If the input filehandle is a
* pipe, the gauge may not work properly.
*
* - Implemented a lowermem limit (MINTOTALMEM option) for those
* people who wants to see at least the beginning of a big anim
* (idea by Allan Odgaard (Duff@DK-Online.DK)).
*
* - Implemented multi-line preferences, supports comments and
* per-project settings (MATCHPROJECT option). The old preference
* files/vars are compatible.
*
* - The stack size for the OM_NEW method is now checked. If the
* required size (curretly 12kb) isn't available, a requester will
* notify the user and the method returns an error.
*
* V1.7
* - Recompiled with SAS/C 6.57. Switched the peephole optimizer on
* (see V1.4 bugs).
*
* - Rewrote the DICECOLOR dithering/remapping code. The DICECOLOR
* color mode now creates a colormap per frame (animation.datatype
* 40.7 does not support these colormap changes per frame (it's
* output looks like a color trash). Custom animation players which
* uses animation.datatype subclasses for loading (like my
* DBufDTAnim) don't have this problem. animation.datatype V41 will
* support these colormaps-per-frame.
*
* I changed the algorithm from a single-pass into a multi-pass
* operation, which allows the code to run on other output modes
* like ORDERED or FS (Floyd-Steinberg). A side-effect of this
* change is that options like COLORERROR and DICESKIP are selected
* automatically, which is more user-friendly.
*
* If you want to get the old DICECOLOR output, use
* DITHER=COLOR PALETTEPERFRAME options.
*
* - The mpegvideo.datatype uses 24 bit-colors internally and
* writes 32 bits per (r,b,g) gun. Now the high order bits of each
* color gun are replicated through the whole INT32.
*
* - Fixed a bug in the SAMPLE option, which caused possible crashes.
*
* - Fixed a bug in LibExpunge (didn't check lib_OpenCnt), which is
* also present in all my other external BOOSI classes (and
* datatypes).
* Thanks to Guenter Niki (gniki@informatik.uni-rostok.de) for
* reporting this bug.
*
* - Implemented the mpeg saving code (mpeg encoder). Currently,
* only mpeg-1 streams are written out.
* (Will be enabled in the public versions ONLY upon request;
* code is currently under construction).
*
* - Increased the stack requirements from 12kb up to 16kb, mainly
* to allow more recursive operations.
*
* - Implemented random access to frames (e.g you need not to load
* the whole animation, decoding is done on the fly).
* (Will be enabled in the public versions ONLY upon request;
* code is currently under construction,
* the matching LOADALL switch it set everytimes).
*
* V1.8
* - Added partial support for mpeg-2 (MPEG-2 does NOT work yet !),
* both encoder+decoder.
*
* - Added my own WritePixelArray8 replacement, which operates
* directly on the fast-mem bitmaps. This saves some internal
* copies, chipmem buffer for WPA8 etc.
*
* - Added my own scaling routine, replacing
* graphics.library/BitMapScale (which needs chipmem as temp.
* buffer).
* Does not work properly yet.
*
* - Fixed the gauge, which didn't work correctly with large streams
* (>= 8MB).
* Fixed.
*
* - The gauge ha now a text info, which shows the remaining time
* to decode.
*
* - Added experimental stack swapping code. The "Need more stack"-
* requester has been removed for this reason.
*
* This also fixes a possible deadlock of "input.device" because
* the GM_LAYOUT method was running with low stack.
* Fixed.
*
* - Color table setup now retries color table build with an increased
* COLORERROR if table (set by LUM_RANGE * CR_RANGE * CB_RANGE) does
* not fit. This allows any #?_RANGE value.
*
* - Fixed different problems within color setup. Now this should
* work with a higher quality, and a little bit faster.
*
* - Fixed the descriptor, which din't match all mpeg video streams.
* Fixed.
*
* - DTM_WRITE should return ERROR_NOT_IMPLEMENTED if DTWM_RAW mode is
* requested (becuase the encoder has been disabled, e.g. commented
* out). Now this is correctly done.
* Fixed.
*
* - The mc68060-Version now checks for the AFF_68060 (1L<<7) execbase
* flag instead using the AFF_68040.
* Fixed.
*
* - Added QUALITY prefs option and matching float-dct code.
*
* V1.9
* - Recompiled with SAS/C 6.58. Should fix some mc68060 related
* problems.
*
* - Minor and major housekeeping changes.
*
* - Added HAM code and HAM dither option as requested by many people.
* Thanks to Olaf Barthel for his fast HAM conversion code.
*
* - DTA_ObjName is now set (and equals to DTA_Name).
*
* - GM_LAYOUT/DTM_PROCLAYOUT code has been removed because
* animation.datatype class does the same.
*
* - Removed NOREMAP switch (and matching DTM_FRAMEBOX code) because
* this was an ugly hack. After all, it seems that MuliView
* sets ADTA_Remap to FALSE on it's custom screens, and that
* using ADTA_Remap == FALSE on a screen which does not have the
* matching size may cause trouble.
*
* - ADTA_NumColors is now set to the number of used colors instead
* of 1UL << anim_depth. This saves some pens when allocating
* shared pens on shared screens.
* When palette-per-frames are used, the number of colors equals to
* 1UL << anim_depth again.
*
* - Moved scaling code before dithering code. It now scales the lum,
* cr, cb data, which is more usefull when doing ordered or HAM
* dithering.
*
* - VMM support seems to be safe...
*
* - Changed the whole prefs-system. Now the defaults options are more
* usefull and are adapted correctly to some settings.
*
* - DITHER option now defaults to HAM, for those people who don't
* like to edit the prefs-file.
*
* - Added NOPALETTEPERFRAME/S, PFRAMES/S, BFRAMES/S, NOLOADALL/S,
* PROGRESSGAUGE/S, NOQUALITY/S switches to support multi-line
* prefs-files which uses the MATCHPROJECT feature.
*
* - Internal timing now uses animation.datatype V41
* ADTA_TicksPerFrame instead of ADTA_FramesPerSecond. This
* makes timing more precise.
* (ADTA_TicksPerFrame means 1200 / fps, based on realtime.library's
* timing model).
*
* - Increased the decoding the speed a little bit. But this may affect
* stability if someone feeds a corrupt mpeg file in the datatype.
* I try to fix the problem...
*
* - Now uses Peter McGavin's (p.mcgavin@irl.cri.nz) WritePixelArray8
* code (the C version).
*
* - Fixed the encoder stack problem.
*
* - The encoder now has no problems with dynamic frame delays (e.g.
* alf_Duration field in adtFrame).
*
* - The SKIP option now uses struct adtFrame -> alf_Duration instead
* of creating empty frames. This causes that the SKIPFRAMES option
* works only with animation.datatype V41.
*
* - Fixed the bug that the last sample might be too long, which
* caused unallocated memory reads (but only a few bytes) and small
* clicks at the end of the animation.
*
* - The startup-code has been rewritten, the code now gurantees that
* the order of OpenLibrary and CloseLibrary are correct and in a
* more usefull order.
*
* - Updated the autodoc a little bit.
*
* V1.10
* INTERNAL RELEASE
*
* - Large code cleanup.
*
* - If we reach the file end, we now add a end of sequence code
* manually to avoid any problems if we does not see the end code
* (this occurs in the NOLOADALL mode in the past...).
*
* - Removed all remaining parts of "recmpeg". Now I'm allowed to
* release the source :-)
*
* - Moved the encoder to the mpegvideo.datatype V2.
*
* - Moved the YUV -> 24-bit interleaved-planar to
* mpegvideo.datatype V2.
*
* - Removed the whole MPEG-2 support. mpegvideo.datatype V2 does this
* better.
*
* - Wrote a replacement for the 24 bit planar code (currently
* non-interleaved).
*
* - Rewrote the 24/15/16 bit dither code.
* Should fix some visual problems.
*
* - Fixed the bug that animation.datatype V41 wasn't detected
* correctly (the version check didn't match, therefore
* any V41 related features were not used).
* Fixed.
*
* - Added GAMMACORRECT and CHROMACORRECT options.
*
* - Removed BestModeIDA code because animation.datatype does the
* same job (better).
*
* - Fixed the bug that MODEID=0 turns the internal mode selection
* on instead of using LORES.
* This also requires a change in the prefs behaviour, the
* default value for the MODEID option is now "-1".
* Fixed.
*
* - Removed all internal accesses to ADTA_BitMapHeader because they
* are unneccesary (dead code).
*
* - The VERBOSE output is now turned on if a serious error occurs.
*
* - If frames are skipped (using the NOPFRAMES or NOBFRAMES option)
* now the duration of the last frame is increased to get sync
* with the stream time.
*
* - Fixed the bug that the total number of frames might be incorrect
* in rare cases.
* Fixed.
*
* - Fixed a bug in the color setup of ORDERED dithering which
* caused that the values runned from 0 upto 256 (256 == 0 in an
* UBYTE). Now the color values are correctly running from 0-255.
* Fixed.
*
* Fixed the same bug in GRAY dither setup.
* Fixed.
*
* V1.11
* - Enabled the NOLOADALL mode for the public.
*
* - Small code cleanup to remove some unneccesary parts of code
* (mainly the obsolete encoder support).
*
* - Fixed the bug that the depth of a CyberGFX ARGB bitmap must be 32
* instead of 24.
* Fixed.
*
* - Added some safety in CyerGFX LockBitMap handling (which has a bug
* in tag parsing).
*
* - Added workaround for NOLOADALL mode that ADTM_LOADFRAME returns
* 1UL instead of NULL if it forgets a frame (to avoid that the
* playback stops...).
* Not nice...
*
* - Fixed a bug in 24bit -> HAM dithering introduced in V1.10.
* Fixed.
*
* - Replaced stack swapping code by a "standard module".
*
* - Increased the "default" buffer size from 4096 up to 16384.
* This makes the gauge less accurate for small streams, but
* gives a small speedup when parsing large streams.
*
* SEE ALSO
* animation.datatype,
* mpegsystem.datatype, mpegvideo.datatype
* picmovie.datatype,
* paranimdtcpatch
*
*******************************************************************************
*
*/
/*****************************************************************************/
DISPATCHERFLAGS
struct IClass *ObtainMPEGVideoEngine( REGA6 struct ClassBase *classbase )
{
return( (classbase -> cb_Lib . cl_Class) );
}
/*****************************************************************************/
DISPATCHERFLAGS
struct Library *LibInit( REGD0 struct ClassBase *classbase, REGA0 BPTR seglist, REGA6 struct ExecBase *sysbase )
{
#ifdef USEIEEELIB
extern struct Library *MathIeeeDoubBasBase;
#endif /* USEIEEELIB */
classbase -> cb_SegList = seglist;
classbase -> cb_SysBase = sysbase;
InitSemaphore( (&(classbase -> cb_Lock)) );
#ifdef REQUIREDAFF
/* Check if the requested cpu/fpu is available*/
if( ((classbase -> cb_SysBase -> AttnFlags) | REQUIREDAFF) != (classbase -> cb_SysBase -> AttnFlags) )
{
return( NULL );
}
#endif /* REQUIREDAFF */
/* Requires at least Kick 3.0 */
if( (classbase -> cb_SysBase -> LibNode . lib_Version) >= 39UL )
{
/* Obtain ROM libs */
if( classbase -> cb_UtilityBase = OpenLibrary( "utility.library", 39UL ) )
{
#undef GfxBase
if( classbase -> cb_GfxBase = (struct GfxBase *)OpenLibrary( "graphics.library", 39UL ) )
{
classbase -> cb_CyberGfxBase = OpenLibrary( CYBERGFXNAME, CYBERGFXVERSION );
if( classbase -> cb_IntuitionBase = OpenLibrary( "intuition.library", 39UL ) )
{
if( classbase -> cb_DOSBase = OpenLibrary( "dos.library", 39UL ) )
{
#ifdef USEIEEELIB
if( MathIeeeDoubBasBase = OpenLibrary( "mathieeedoubbas.library", 38UL ) )
{
#endif /* USEIEEELIB */
/* vmm.library will be opened on demand (see dispatch.c) */
classbase -> cb_VMMBase = NULL;
return( (&(classbase -> cb_Lib . cl_Lib)) );
#ifdef COMMENTED_OUT
CloseLibrary( MathIeeeDoubBasBase );
#endif /* COMMENTED_OUT */
#ifdef USEIEEELIB
}
CloseLibrary( (classbase -> cb_DOSBase) );
#endif /* USEIEEELIB */
}
CloseLibrary( (classbase -> cb_IntuitionBase) );
}
CloseLibrary( (classbase -> cb_CyberGfxBase) );
CloseLibrary( (&(classbase -> cb_GfxBase -> LibNode)) );
}
CloseLibrary( (classbase -> cb_UtilityBase) );
}
}
return( NULL );
}
/*****************************************************************************/
DISPATCHERFLAGS
LONG LibOpen( REGA6 struct ClassBase *classbase )
{
LONG retval = (LONG)classbase;
BOOL success = TRUE;
ObtainSemaphore( (&(classbase -> cb_Lock)) );
/* Use an internal use counter */
classbase -> cb_Lib . cl_Lib . lib_OpenCnt++;
classbase -> cb_Lib . cl_Lib . lib_Flags &= ~LIBF_DELEXP;
if( (classbase -> cb_Lib . cl_Lib . lib_OpenCnt) == 1U )
{
if( (classbase -> cb_Lib . cl_Class) == NULL )
{
success = FALSE;
if( classbase -> cb_DataTypesBase = OpenLibrary( "datatypes.library", 39UL ) )
{
if( classbase -> cb_SuperClassBase = OpenLibrary( "datatypes/animation.datatype", 39UL ) )
{
if( classbase -> cb_Lib . cl_Class = initClass( classbase ) )
{
success = TRUE;
}
}
}
}
}
if( !success )
{
CloseLibrary( (classbase -> cb_SuperClassBase) );
CloseLibrary( (classbase -> cb_DataTypesBase) );
classbase -> cb_DataTypesBase = classbase -> cb_SuperClassBase = NULL;
(classbase -> cb_Lib . cl_Lib . lib_OpenCnt)--;
retval = 0L;
}
ReleaseSemaphore( (&(classbase -> cb_Lock)) );
return( retval );
}
/*****************************************************************************/
DISPATCHERFLAGS
LONG LibClose( REGA6 struct ClassBase *classbase )
{
LONG retval = 0L;
ObtainSemaphore( (&(classbase -> cb_Lock)) );
if( classbase -> cb_Lib . cl_Lib . lib_OpenCnt )
{
(classbase -> cb_Lib . cl_Lib . lib_OpenCnt)--;
}
if( ((classbase -> cb_Lib . cl_Lib . lib_OpenCnt) == 0U) && (classbase -> cb_Lib . cl_Class) )
{
if( FreeClass( (classbase -> cb_Lib . cl_Class) ) )
{
classbase -> cb_Lib . cl_Class = NULL;
CloseLibrary( (classbase -> cb_SuperClassBase) );
CloseLibrary( (classbase -> cb_DataTypesBase) );
}
else
{
classbase -> cb_Lib . cl_Lib . lib_Flags |= LIBF_DELEXP;
}
}
ReleaseSemaphore( (&(classbase -> cb_Lock)) );
if( (classbase -> cb_Lib . cl_Lib . lib_Flags) & LIBF_DELEXP )
{
retval = LibExpunge( classbase );
}
return( retval );
}
/*****************************************************************************/
DISPATCHERFLAGS
LONG LibExpunge( REGA6 struct ClassBase *classbase )
{
BPTR seg;
#ifdef USEIEEELIB
extern struct Library *MathIeeeDoubBasBase;
#endif /* USEIEEELIB */
if( classbase -> cb_Lib . cl_Lib . lib_OpenCnt )
{
classbase -> cb_Lib . cl_Lib . lib_Flags |= LIBF_DELEXP;
seg = NULL;
}
else
{
Remove( (&(classbase -> cb_Lib . cl_Lib . lib_Node)) );
seg = classbase -> cb_SegList;
CloseLibrary( (classbase -> cb_VMMBase) );
#ifdef USEIEEELIB
CloseLibrary( MathIeeeDoubBasBase );
#endif /* USEIEEELIB */
CloseLibrary( (classbase -> cb_DOSBase) );
CloseLibrary( (classbase -> cb_IntuitionBase) );
CloseLibrary( (classbase -> cb_CyberGfxBase) );
CloseLibrary( (&(classbase -> cb_GfxBase -> LibNode)) );
CloseLibrary( (classbase -> cb_UtilityBase) );
FreeMem( (APTR)((ULONG)(classbase) - (ULONG)(classbase -> cb_Lib . cl_Lib . lib_NegSize)), (ULONG)((classbase -> cb_Lib . cl_Lib . lib_NegSize) + (classbase -> cb_Lib . cl_Lib . lib_PosSize)) );
}
return( (LONG)seg );
}